package com.haozi.ehub.core.security;

import com.haozi.ehub.core.util.CodeUtils;
import com.haozi.ehub.core.util.RSAEncoderUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * Security自定义的密码验证类
 * @author ：terry
 * @date ：Created in 2020/6/29 11:49
 * @version: 1.0
 */
@Slf4j
public class SecurityPasswordEncoder implements PasswordEncoder {

    /**
     * 密码加密
     * @author     ： terry
     * @date       ： Created in 2020/7/2 17:17
     * @param charSequence 未加密的密码
     * @return String 返回加密后的密码
     */
    @Override
    public String encode(CharSequence charSequence) {
        log.info("Execute securityPasswordEncoder encode");
        return passwordEncoder().encode(charSequence);
    }

    /**
     * 密码验证
     * @author     ： terry
     * @date       ： Created in 2020/7/2 17:17
     * @param charSequence 未加密的密码
     * @param s 加密后的密码
     * @return boolean 返回true/false
     */
    @Override
    public boolean matches(CharSequence charSequence, String s) {
        log.info("Execute securityPasswordEncoder matches");
        //由于http请求会把字符串中的“+”替换成“ ”，所以先做一次字符替换
        String replace = charSequence.toString();
        if(StringUtils.contains(replace,CodeUtils.SPACE)){
            replace = StringUtils.replace(replace, CodeUtils.SPACE, CodeUtils.PLUS_SIGN);
        }
        final String password = RSAEncoderUtils.decrypt(replace);
        return passwordEncoder().matches(password, s);
    }

    /**
     * 公共的获取BCryptPasswordEncoder的方法
     * @author     ： terry
     * @date       ： Created in 2020/7/2 17:22
     * @return BCryptPasswordEncoder
     */
    private BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}
